home *** CD-ROM | disk | FTP | other *** search
/ Euroscene 1 / Euroscene 1.iso / resource / mac2e.lha / Mac2E / Docs / Mac2E.docE next >
Encoding:
Text File  |  1994-01-12  |  23.3 KB  |  500 lines

  1. *******************************************************************************
  2.  
  3.                   Mac2E (v2.0)
  4.              PreProcessor of macros for E language
  5.             Archive of January the 9th 1994
  6.            (c) Copyright 1993, 1994, Lionel Vintenat
  7.  
  8. *******************************************************************************
  9.  
  10. LOOK OUT ! Mac2E needs Workbench 2.0 or more to work. Sorry for 1.3 users (see
  11. `future'). Likewise, there are some restrictions for the using of the executa-
  12. ble files of this archive (see `bugs').
  13.  
  14. 1. Introduction
  15. ~~~~~~~~~~~~~~~
  16. 1.1. How everything started...
  17. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  18.     At the beginning, there are the Amiga E and me. It was wonderful,
  19. together we made some nice programs in very little time. As I hadn't (and I
  20. still haven't yet) the RKMs, these programs were very ugly, without graphic
  21. interface, but no care, it was the good time... And then, MUI arrived, making
  22. relationship between Amiga E and me very difficult. Why ? Well, Amiga E doesn't
  23. allow to use macros, and to program MUI without macro, it's almost madness !
  24. On the other hand, it was unthinkable to miss something like MUI. Then, I tried
  25. to use C language for some time : it was the beginning of dark years for my
  26. Amiga... And then, I had access to INTERNET. So I talked Wouter about my pro-
  27. blem, and he advised me to use a C preprocessor : what such a great idea ! But
  28. after several tries, it revealed very heavy to use : compilation time was
  29. multiplied by 100, and above all the compilator didn't print the corret number
  30. of line when an error occured. So the idea of Mac2E came...
  31.  
  32. 1.2. Presentation
  33. ~~~~~~~~~~~~~~~~~
  34.     Mac2E is a preprocessor for the Amiga E compilator of Wouter van
  35. Oortmerssen, but which only knows one thing : to replace macros in E source
  36. files. In other words, the aspects "conditionnal compilation" and "file inclu-
  37. sion", for instance aren't supported by Mac2E, wheras it's the case in almost
  38. every C preprocessors. Why only this aspect ? See `how everything started...'.
  39.     Ah ! I was forgetting : all the executable files of this archive
  40. are of course written in Amiga E !
  41.  
  42. 1.3. Spirit
  43. ~~~~~~~~~~~
  44.     I designed Mac2E following 3 ideas :
  45.         - to make something simple to use (in the same way like
  46. Amiga E)
  47.         - to resolve problems I met using a C preprocessor with Amiga E
  48. (see `how everything started...')
  49.         - to make a preprocessor that using doesn't make E source
  50. files dependent of it, in other words, if the next version of Amiga E enables
  51. macro preprocessing (Wouter said to me it may be), changing from Mac2E to
  52. this preprocessor won't need a lot of modifications in your source files
  53.  
  54.     In that 2.0 version, I couldn't unfortunately success in making all
  55. that I wanted, namely that despite a lot of optimisations (see `history'),
  56. Mac2E isn't really fast (in truth very slow) relating to the rocket Amiga E.
  57. But don't be desesperate : I think that Mac2E is faster than a C preprocessor
  58. (I try with CPP, the C preprocesseur of GCC), and I will improve this in the
  59. next versions (see `future').
  60.     On the other hand :
  61.         - Mac2E is closed to a C preprocessor in its using, so its
  62. learning will be very quick for the most part of programmers
  63.         - Mac2E never introduce line feed when it replaces a macro,
  64. so the compilator always prints the correct line number in case of error
  65.         - the definition of the macros is done in separated files
  66. different from your E source files, and the macro files are directly given
  67. to the Mac2E command without needing to change a character in your E source
  68. files, so changing from Mac2E to a future (maybe) Amiga E preprocessor will
  69. be very simple and won't oblige you to make a lot of modifications in your
  70. E source files
  71.  
  72.     So waiting the next release of Mac2E (see `future'), I advise all
  73. owners of slow Amiga to use, for big E source files with a lot of macros
  74. inside, the programme EPP of Barry Wills (e-mail bwillskkirk.safb.af.mil)
  75. available on aminet. This one allow to simulate file inclusion of a classic C
  76. preprocessor. So, you just have to concentrate the using of macros in one E
  77. source file (the remaining being distributed in another E source files) in
  78. order to use Mac2E only when you change this file full of macros, and not at
  79. any compilation.
  80.  
  81. 2. Utilisation
  82. ~~~~~~~~~~~~~~
  83. 2.1. Calling syntax
  84. ~~~~~~~~~~~~~~~~~~~
  85.     Mac2E is only a CLI command and can't be used from Workbench. Its
  86. calling syntax is very simple :
  87.     Mac2E e_source_file e_destination_file {macro_files}
  88. where :
  89.     - e_source_file is the name of a E source file (possibly with its path)
  90. which contains some macros to replace (see `macros in your source files')
  91.     - e_destination_file is the name of a file (possibly with its path)
  92. which will be created by Mac2E, and which will contain e_source_file but with
  93. the macro replaced (see `macros in your source files')
  94.     - {macro_files} is a list of names of macro files (possibly with their
  95. path), the names are seperated each other with some spaces (a least one) (see
  96. `macro files')
  97.     For those who know, Mac2E parses the command line with the Workbench 2.0
  98. function ReadArgs(). So the calling "Mac2E ?" returns the calling syntax
  99. "in ReadArgs form", namely "FROM/A,TO/A,WITH/A/M". So you can also call Mac2E
  100. in using the properties of the ReadArgs function.
  101.  
  102. 2.2. Macro files
  103. ~~~~~~~~~~~~~~~~
  104.     Macro files are annex files, different from E source files, which
  105. contains only macro definitions. When you call Mac2E (see `calling syntax'),
  106. the macro files given as parameter are analysed to memorise the macros which
  107. are defined inside.They are these macros which will be used for the replace-
  108. ments in the E source file.
  109.  
  110. 2.2.1. Structure
  111. ~~~~~~~~~~~~~~~~
  112.     The structure of a macro file is very simple. In fact, there's only 2
  113. things to know.
  114.     First, the definition syntax of a macro is exactly the same as in C
  115. language (see `macro definition'), particularly it begins with "#define".
  116.     Second, between each macro definition, you can insert comments under
  117. the form you want (it isn't necessary to surround them with /* and */, or
  118. anything else). Indeed, Mac2E only searches the string "#define " in the
  119. macro file (avoiding all until it finds it) in order to point the beginning
  120. of a macro definition. So the only restriction for a comment is that it can't
  121. contain the string "#define ".
  122.  
  123. 2.2.2. Macro definition
  124. ~~~~~~~~~~~~~~~~~~~~~~~
  125.     The macro definition must follow this syntax :
  126.  
  127.     #define macro1_name macro1_body
  128. or
  129.     #define macro2_name(parameter1,parameter2) macro2_body
  130. or
  131.     #define macro3_name macro3_body_part1 \
  132.                 macro3_body_part2 \
  133.                 macro3_body_part3
  134.  
  135.     The first example corresponds to a very simple macro without any
  136. parameter, and which body fits one line.
  137.     The second example corresponds to a macro with parameters.
  138.     The third example corresponds to a macro which body doesn't fit one
  139. line.
  140.  
  141.     Once Mac2E has identified the macro, it begins again its blind search
  142. of the string "#define ".
  143.  
  144.     To understand how a macro is used, see `macros in your source files'.
  145.  
  146.     For more macro definition examples, see `Mac2E and MUI'.
  147.  
  148. 2.2.2.1. #define
  149. ~~~~~~~~~~~~~~~~
  150.     So macro declaration begins by the string "#define". This one can be
  151. anywhere (not necessarily at the beginning of a line) and must always be
  152. followed by at least one space or one tabulation. If it isn't the case, Mac2E
  153. won't recognize the beginning of the macro declaration, and will go on without
  154. printing any error, so be careful !
  155.  
  156. 2.2.2.2. Macro names
  157. ~~~~~~~~~~~~~~~~~~~~
  158.     Then comes the name of the macro itself. This one can be any combina-
  159. tion of characters a..z, A..Z, 0..9 and _ (underscore). Namely, "120" or "__"
  160. or "FOR" are valid macro names, but I will never advise them to someone ! Don't
  161. be vicious, and rather call your macros "foo" or more seriously "Open_Window1".
  162.  
  163. 2.2.2.3. Macro parameters
  164. ~~~~~~~~~~~~~~~~~~~~~~~~~
  165.     Then comes parameters declaration. A macro can have from 0 to an infi-
  166. nity of parameters. If it hasn't any, the macro body declaration replace para-
  167. meters declaration. But, if it gets some, they are separated each other by
  168. commas, and surrounded by parenthesises. The first of these ones must be
  169. sticked to the name of the macro. But you can insert some spaces or some tabu-
  170. lations among the commas, the parameter names, and the parenthesises inside
  171. these ones. The parameter names follow the same rules than the name of the
  172. macro itself.
  173.  
  174. 2.2.2.4. Macro body
  175. ~~~~~~~~~~~~~~~~~~~
  176.     Finally, the macro declaration ends by the macro body. This one must
  177. be separated from the parameters (or from the macro name if the macro hasn't
  178. any parameter) by at least one space or one tabulation. In fact, all the spaces
  179. and all the tabulations that Mac2E meets before the body are eliminated. The
  180. first found character different from a space or from a tabulation indicates
  181. the body beginning. Now, all the met characters (even the spaces and the tabu-
  182. lations) are considered as part of the macro body. This one ends as soon as a
  183. carriage return is found. If the carriage return is preceded by a \, the
  184. carriage return and the \ are ingored and Mac2E continues to read following
  185. characters as part of the macro body. Be careful : the continuation of the 3
  186. characters '\', ' ' and carriage return will be interpreted as if '\' and
  187. ' ' belong to the macro body and as if the carriage return indicates the end
  188. of the macro body. So, the carriage return must be sticked to the \ in order
  189. to make Mac2E understand that it must continue the reading of the macro body
  190. on the following line. The example below illustrate all this. Finding this
  191. macro definition
  192. #define macro body_part1   body_part2 \
  193.  body_part3 body_part4 \ \
  194.     body_part5
  195. Mac2E will understand that macro has this body :
  196. "body_part1   body_patr2  body_part3 body_part4 \     body_part5"
  197.  
  198. 2.3. Macros in your source files
  199. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  200.     After the analyse of all the macro files, Mac2E begins the replacing
  201. of macros in the source file given as parameter, and writes the destination
  202. file.
  203.  
  204. 2.3.1. A macro in your source file
  205. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  206.     Mac2E identify a macro in the source file with its name (surprising
  207. isn't it ?). Be careful, Mac2E is case sensitive. To be identify, macro names
  208. must be preceded and followed by a separation character, namely different from
  209. a..z, A..Z and _.
  210.     The contents of the comments (even if these ones are laced) or the
  211. strings between ' are avoided for the search. So you haven't to take care
  212. of conflicts that may appear. Likewise, the character ' in "'" isn't inter-
  213. preted as the beginning of a string. If it is possible to say that I have
  214. thought about all that may occur, I think that Mac2E can treat all the special
  215. cases like the previous one. But Mac2E assumes that your source file is
  216. correct. For instance, if you write 'rock'n roll' instead of 'rock\an roll'
  217. in one of your source files, Mac2E will interpret the second ' as the mark
  218. of the string end, and the third ' as the mark of the beginning of another
  219. string, that may cause some errors !
  220.  
  221. 2.3.2. A macro without any parameter
  222. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  223.     If Mac2E identify a macro foo in your source file, this macro being
  224. declared without any parameter, Mac2E will textually replace foo with its body.
  225.     Of course, if this body itself contains some macro names, these ones
  226. will also be replaced in correct way. Be careful, Mac2E doesn't check if
  227. your macro definitions are recursive. So, if Mac2E seems to buckle and finally
  228. crashes, see again your macro definitions...
  229.  
  230. 2.3.3. A macro with some parameters
  231. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  232.     Let's take an example :
  233.     Suppose that Mac2E indentify in your source file a macro foo which
  234. has been declared like that :
  235. #define foo(variable,value) variable:=variable+value
  236.     Suppose now that in your source file, there is foo(a,3).Then Mac2E
  237. will textually replace foo(a,3) with a:=a+3.
  238.     Namely, for each parameter you have given at declaration time (this
  239. kind of parameter is called formal parameter), Mac2E links a parameter you
  240. have given in your source  file (this kind of parameter is called real parame-
  241. ter), and replace each occurence of a formal parameter by its linked real
  242. parameter in the macro body, before replacing the macro by its body itself.
  243. In order to work, the first parenthesis which introduces the real parameters
  244. must be directly sticked to the macro name. However, you can insert spaces or
  245. tabulations among the commas, the parameter names, and the parenthesis inside
  246. these ones.
  247.     Of course, if the body itself contains some macro names, these ones
  248. will also be replaced in correct way. Be careful, Mac2E doesn't check if
  249. your macro definitions are recursive. So, if Mac2E seems to buckle and finally
  250. crashes, see again your macro definitions... But, you can write in your source
  251. files foo1(foo2(foo3)) where foo1, foo2 and foo3 are macros, Mac2E will replace
  252. all that correctly.
  253.     
  254. 2.4. Errors
  255. ~~~~~~~~~~~
  256.     For in/out errors (impossible to open the source file for instance),
  257. Mac2E print a fully explaining message.
  258.  
  259.     But for errors met during macro file analyse or during source file
  260. analyse, Mac2E only prints a very simple message which looks like
  261. "Error in line 100 !", always for speed considerations. The returned line
  262. number is exact at about 1. Indeed, the printed error may be at the previous
  263. line.
  264.     During macro file analyse, Mac2E only prints an error if the defini-
  265. tion syntax of one of your macro is faulty. See `macro definition'.
  266.     During source file analyse, Mac2E only prints an error if a macro
  267. has been identified but the number of its arguments is wrong.
  268.  
  269. 3. Mac2E and MUI
  270. ~~~~~~~~~~~~~~~~
  271.     If you have read `how everything started...', you know that Mac2E
  272. exists because MUI is infinitively easier to program with macros than without.
  273. So the first (and the only one for now) using example of Mac2E is related with
  274. MUI. You can find in this archive all that you need to use MUI with Amiga E,
  275. in the same way as in C language. To do this, you need 5 things :
  276.     - Mac2E : see `presentation' and `utilisation'
  277.     - mui.m
  278.     - muimaster.m
  279.     - mui.e
  280.     - OptiMUI2E
  281.  
  282.     I remind you that designing mui.m and mui.e, I wanted to do a
  283. "MUI-Amiga E interface" very closed to the C one, so during programing, I
  284. advise you to have next to your Amiga the listing of the mui.h file. Indeed,
  285. this file contains a lot of comments I erased in mui.e to speed up analyse.
  286.  
  287.     All this "interface" is based on MUI 1.4. In the MUI archive, there
  288. are yet some files to use MUI with E language, but they aren't and by far as
  289. much powerful as those provided in this archive. So forget them and use mine !
  290.  
  291. 3.1. mui.m
  292. ~~~~~~~~~~
  293.     mui.m is (as its name indicates it) a classical E include file. It
  294. contains all the structures defined in mui.h, with the only difference that
  295. all the names (structure names and field names) are in tiny letters. This
  296. limitation is Iconvert fault. Indeed, I use an asm include file where I
  297. define all the mui.h structures in assembling macros, and with the original
  298. name (keeping case sensitivity) to create mui.m. But unfortunately, Iconcert,
  299. which translate this asm include file in an E include file, makes all the
  300. names being writen with tiny letters.
  301.     So, if you want to use MUI structures, you have to put at the beginning
  302. of your source file MODULE 'libraries/mui.m'.
  303.  
  304. 3.2. muimaster.m
  305. ~~~~~~~~~~~~~~~~
  306.     muimaster.m is (as its name indicates it) a classical E include file.
  307. It contains all the function definitions of the muuimaster library. The func-
  308. tion names are the same than in C language with the only difference that they
  309. begin with MuI instead of MUI (example : MuI_NewObjectA). This limitation
  310. is enforced by Amiga E, because function names must have their first letter
  311. capital and the second tiny.
  312.     So, if you want to use MUI functions, you have to put at the beginning
  313. of your source file MODULE 'muimaster.m'.
  314.  
  315. 3.3. mui.e
  316. ~~~~~~~~~~
  317.     mui.e is the real force of this "MUI-Amiga E interface" because it
  318. contains all the mui.h macros (constants and more complicated things like
  319. object definitions), but designed to be used with Amiga E. The syntax of
  320. the mui.e macros (declaration and body) is exactly the same than in mui.h file.
  321.     So, if you want to use these MUI macros in your E source files, you
  322. have to launch Mac2E on them before calling the compilator :
  323. Mac2E source.e destination.e MacroFiles/mui.e
  324.  
  325. 3.4. OptiMUI2E
  326. ~~~~~~~~~~~~~~
  327.     If you look at `mui.e', you will see inside the body of object defin-
  328. ition macros some "TAG_IGNORE,0", for instance
  329. "#define WindowObject MuI_NewObjectA('Window.mui',TAG_IGNORE,0". This tag
  330. (as its name indicates it) doesn't make anything at execution time. However,
  331. I was obliged to introduce some to keep the same syntax as in C language
  332. because E lists must be surrounded by [ and ]. So OptiMUI2E comes. This program
  333. removes these useless "TAG_IGNORE,0" from your E source files. Its calling
  334. syntax is :
  335. OptiMUI2E e_source_file e_destination_file
  336. where
  337.     - e_source_file is the name of a source file (eventually with its path)
  338. written in E language where there are some "TAG_IGNORE,0"
  339.     - e_destination_file is the name of a file (eventually with its path)
  340. which will contain e_source_file with all the "TAG_IGNORE,0" removed
  341.     OptiMUI2E also uses the ReadArgs() function of Workbench 2.0 to parse
  342. its command line. The input format of OptiMUI2E is "FROM/A,TO/A".
  343.     In fact, OptiMUI2E replace the string "[TAG_IGNORE,0," (typical of
  344. a MUI macro which creates an object) by [.
  345.     Be careful, OptiMUI2E sometimes removes carriage return from your
  346. source files to respect E syntax where lines must end on a comma. So, it's not
  347. sure that the destination file has the same number of lines than the source
  348. one, which may cause the compilator give wrong line number in case of error.
  349. So, I advise you to use OptiMUI2E only for a final compilation when your
  350. program is finished and fully tested. Anyway, OptiMUI2E isn't necessary at
  351. all to use MUI with Amiga E. It reduces a bit the source file size and the
  352. executable file size when they use MUI macros, but it isn't Power Packer !
  353. I only make OptiMUI2E because I'm maniac, and I think that only those who are
  354. maniac too will use OptiMUI2E !
  355.     Be careful (bis), OptiMUI2E doesn't work on 68000 based Amiga (see
  356. `bugs').
  357.  
  358. 4. Bugs
  359. ~~~~~~~
  360.     Don't panic ! The list below doesn't contain only bugs, but rather
  361. some restrictions.
  362.  
  363.     * Mac2E only works under Workbench 2.0 or more : the next version will
  364. run under 1.3 (see `future')
  365.     * OptiMUI2E doesn't work on 68000 based Amiga. As mine has a 68030
  366. inside, I didn't take care of even address alignement, et it was too late
  367. when I realized my error... Anyway, this program isn't necessary at all, and
  368. I think I will correct this in the next version (see `future')
  369.     * Mac2E doesn't check if your macro declarations are recursive, so
  370. if it is the case, Mac2E may go in very deep thoughts that only a reset will
  371. be able to stop...
  372.     * Mac2E doesn't always check that it gets all the memory it requested.
  373. For big memory requests (like for loading a file), it checks that it has
  374. got what it had requested, but not for small memory requests (like 10 bytes
  375. to store a macro name), always for speed considerations. So, never launch
  376. Mac2E during critical memory conditions, where it may crash your Amiga...
  377. However, this wouldn't be a big problem because Mac2E isn't really memory
  378. hungry : it needs about the total of all used macro file sizes added to the
  379. source file size, and added to about 10 Ko (to be sure).
  380.     * Mac2E doesn't exactly check the validity of your macro definitions
  381. explained in `macro definition'. Some more laxist definitions may be accepted
  382. by Mac2E. However, I won't tell you which ones, so nobody will try them. It's
  383. better to follow this previous advice because the next versions of Mac2E will
  384. be less tolerant.
  385.  
  386.     To sum up, all the executable files of this archive are full of bugs,
  387. but they may run without any problem in 99% of cases, and with good results.
  388. I prefered sacrify the robustness of these programs than their speed.
  389.  
  390. 5. History
  391. ~~~~~~~~~~
  392. * v1.0 : first working version of Mac2E (VERY VERY SLOW...)
  393.  
  394. * v2.0 : version identical to the 1.0 one, but with a lot of assembling opti-
  395.         misations (10 times faster !)
  396.          Opti2MUI added
  397.          first released version
  398.  
  399. 6. Future
  400. ~~~~~~~~~
  401.     This first released version of Mac2E is completly working but compared
  402. to AmigaE it's a tortoise ! So, for the next versions, I will try to improve
  403. the speed :
  404.     - all macro files will be pre-processed to speed up their analyse
  405.     - Mac2E will allow file inclusion in the same way like a C preprocessor
  406. by calling itself Amiga E and by managing itself the line numbers in case of
  407. error by using the compiler messages
  408.     - Mac2E will manage macro preprocessing a bit like the tool "make", in
  409. order to do macro replacings only when it's necessary
  410.     - Mac2E will be able to directly call OptiMUI2E
  411.     - Mac2E will run under Workbench 1.3
  412.     - I will probably change Mac2E name if all previously features are
  413. supported !
  414.     - OptiMUI2E will be proposed in 68000 and 68020+ versions
  415.  
  416.     This can seem a bit ambitious, but the base is still there. So, if
  417. not too much bugs are reported (I hope so !), it may not take a long time
  418. to do. Wait and see !
  419.  
  420. 7. Distribution
  421. ~~~~~~~~~~~~~~~
  422.     You can freely redistribute this archive by any way of communication.
  423. This archive can also be put in any public domain collection like FISH, CAM
  424. or DPAT. But nothing except the price of disks and the price of the sending
  425. can be asked for redistribution. However, the WHOLE archive must be redistri-
  426. bute. It must have the following structure :
  427.     Mac2E/Bin/Mac2E
  428.     Mac2E/Bin/OptiMUI2E
  429.     Mac2E/Docs/Mac2E.docE
  430.     Mac2E/Docs/Mac2E.docF
  431.     Mac2E/Docs/Mac2E.guideE
  432.     Mac2E/Docs/Mac2E.guideF
  433.     Mac2E/MacroFiles/mui.e
  434.     Mac2E/Modules/libraries/mui.m
  435.     Mac2E/Modules/muimaster.m
  436.     Mac2E/readme.first
  437.     Mac2E/ReadMe.mui
  438.  
  439.     Likewise, all these files (except mui.m, muimaster.m, mui.e and
  440. ReadMe.mui) stay under copyright of `the author'. None of them can be modi-
  441. fied without my authorization.
  442.     This program is provided without any warranty of any kind : you use it
  443. at your own risk !
  444.  
  445.     This program is distributed under the concept of Freeware, so you
  446. aren't obliged at all to send me something ! But, I will be happy to receive
  447. anything : Amiga 4000/40, post card, 5$ or a simple e-mail...
  448.  
  449. 8. The author
  450. ~~~~~~~~~~~~~
  451.     You can contact me by mail :
  452.  
  453.         - at my student address until July 1994 included
  454.  
  455.             Lionel Vintenat
  456.             appartement 21
  457.             11 rue François Oulié
  458.             31500 TOULOUSE
  459.             FRANCE
  460.  
  461.         - at my family address
  462.  
  463.             Lionel Vintenat
  464.             3 impasse Boileau
  465.             Lotissement Les Termes
  466.             87270 COUZEIX
  467.             FRANCE
  468.  
  469.     I'd rather receive mail at my student address until July 1994 because
  470. I'm there almost all the time.
  471.  
  472.     You can also contact me through INTERNET. My e-mail address is
  473. vintenat@irit.fr. I'd rather by far receive e-mail than postal mail. I will
  474. always answer questions which will be asked me by e-mail, but on the other
  475. hand, don't expect any answer to postal mail (I become very lazy each time
  476. I have to take a pen...)
  477.  
  478. 9. Credits
  479. ~~~~~~~~~~
  480.     Sepcial thanks :
  481.         - to the Amiga to be the best personal computer
  482.         - to Wouter van Oortmerssen for all his work in compilation
  483. domain (try FALSE, I promise you a surprise !) in general and especially for
  484. Amiga E
  485.         - to Eric Totel to press me to finish this documentation in
  486. a reasonable delay
  487.         - to Stephan Sürken (e-mail s_suerke@informatik.uni-kl.de) for
  488. his Text2Guide utility that I used to make hypertext documentations of this
  489. archive
  490.         - to every member of the French Amiga mailing list who had 
  491. helped me
  492.         - to every programmer who makes public domain in general
  493.  
  494.     Finally, more thanks to all those who will report `bugs', or who will
  495. make some suggestions, or who will send me corrections or translations of this
  496. documentation (excuse me for the very bad English...)
  497.  
  498.     Good programming time with Amiga E and...
  499.  
  500.         NEVER FORGET, ONLY AMIGA MAKES IT POSSIBLE !